package com.bms.config;

import com.bms.common.request.ExpenseReq;
import com.bms.common.response.ExpenseResponse;
import com.bms.entity.Expense;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
@Component
public class ExcelListExporter {

    /**
     * 导出数据到Excel文件
     * @param data 明细列表
     * @param filePath 文件路径
     * @throws IOException 异常抛出
     */
    public void exportExpense(List<ExpenseReq> data, String filePath) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("列表为空！");
        }

        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Data");

            // 定义表头名称
            String[] headers = {
                    "费用ID",
                    "活动名称",
                    "标识名称",
                    "公司代码",
                    "人员代码",
                    "预算",
                    "类型",
                    "创建日期"
            };

            // 创建字段描述行（第一行）
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                headerRow.createCell(i).setCellValue(headers[i]);
            }

            // 填充数据（从第二行开始）
            int rowNum = 1;
            for (ExpenseReq item : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue(item.getExpenseId());
                row.createCell(1).setCellValue(item.getActivityName());
                row.createCell(2).setCellValue(item.getCategoryName());
                row.createCell(3).setCellValue(item.getCompanyCode());
                row.createCell(4).setCellValue(item.getPersonnelCode());
                row.createCell(5).setCellValue(item.getBudget().toString());
                row.createCell(6).setCellValue(item.getType());
                row.createCell(7).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(item.getCreatedDate()));
            }

            // 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 写入文件
            try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
                workbook.write(fileOut);
            }
        }
    }

    /**
     * 按照分类标识汇总数据导出
     * @param data 明细列表
     * @param filePath 文件路径
     * @throws IOException 异常抛出
     */
    public void exportExpenseTotalList(List<ExpenseResponse> data, String filePath) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("列表为空！");
        }

        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Data");

            // 定义表头名称
            String[] headers = {
                    "机构代码",
                    "标识名称",
                    "预配置金额（元）",
                    "配置总金额（元）",
                    "数量"
            };

            // 创建字段描述行（第一行）
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                headerRow.createCell(i).setCellValue(headers[i]);
            }

            // 填充数据（从第二行开始）
            int rowNum = 1;
            for (ExpenseResponse item : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue(item.getCompanyCode());
                row.createCell(1).setCellValue(item.getCategoryName());
                row.createCell(2).setCellValue(item.getPreBudget().toString());
                row.createCell(3).setCellValue(item.getTotalBudget().toString());
                row.createCell(4).setCellValue(item.getExpenseCount());
            }

            // 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 写入文件
            try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
                workbook.write(fileOut);
            }
        }
    }

    /**
     * 统计每家机构的条线的汇总数据导出
     * @param data 明细列表
     * @param filePath 文件路径
     * @throws IOException 异常抛出
     */
    public void exportLineSummaryList(List<ExpenseResponse> data, String filePath) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("列表为空！");
        }

        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Data");

            // 定义表头名称
            String[] headers = {
                    "机构代码",
                    "条线名称",
                    "条线额度名称",
                    "预配置金额（元）",
                    "配置总金额（元）",
                    "数量"
            };

            // 创建字段描述行（第一行）
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                headerRow.createCell(i).setCellValue(headers[i]);
            }

            // 填充数据（从第二行开始）
            int rowNum = 1;
            for (ExpenseResponse item : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue(item.getCompanyCode());
                row.createCell(1).setCellValue(item.getLineName());
                row.createCell(2).setCellValue(item.getBudgetName());
                row.createCell(3).setCellValue(item.getPreBudget().toString());
                row.createCell(4).setCellValue(item.getTotalBudget().toString());
                row.createCell(5).setCellValue(item.getExpenseCount());
            }

            // 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 写入文件
            try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
                workbook.write(fileOut);
            }
        }
    }

    /**
     * 导出机构的条线的活动明细数据
     * @param data 明细列表
     * @param filePath 文件路径
     * @throws IOException 异常抛出
     */
    public void exportCompanySummaryList(List<ExpenseResponse> data, String filePath) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("列表为空！");
        }

        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Data");

            // 定义表头名称
            String[] headers = {
                    "条线名称",
                    "条线额度名称",
                    "标识名称",
                    "活动名称",
                    "机构代码",
                    "预配置/配置总金额",
                    "预算类型",
                    "数据类型",
                    "明细生成时间"
            };

            // 创建字段描述行（第一行）
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                headerRow.createCell(i).setCellValue(headers[i]);
            }

            // 创建日期格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            // 填充数据（从第二行开始）
            int rowNum = 1;
            for (ExpenseResponse item : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue(item.getLineName());
                row.createCell(1).setCellValue(item.getBudgetName());
                row.createCell(2).setCellValue(item.getCategoryName());
                row.createCell(3).setCellValue(item.getActivityName());
                row.createCell(4).setCellValue(item.getCompanyCode());
                row.createCell(5).setCellValue(item.getBudget().toString());
                // 处理预算类型
                if (item.getBudgetType() == 1) {
                    row.createCell(6).setCellValue("预配置金额");
                } else {
                    row.createCell(6).setCellValue("配置总金额");
                }
                // 处理数据类型
                if (item.getType() == 1) {
                    row.createCell(7).setCellValue("绩效（个人）");
                } else {
                    row.createCell(7).setCellValue("费用（机构）");
                }
                // 处理日期时间
                if (item.getCreatedDate() != null) {
                    row.createCell(8).setCellValue(sdf.format(item.getCreatedDate()));
                } else {
                    row.createCell(8).setCellValue("");
                }
            }

            // 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 写入文件
            try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
                workbook.write(fileOut);
            }
        }
    }

    /**
     * 导出人员的条线的活动明细数据
     * @param data 明细列表
     * @param filePath 文件路径
     * @throws IOException 异常抛出
     */
    public void exportPersonnelCodeSummaryList(List<ExpenseResponse> data, String filePath) throws IOException {
        if (data == null || data.isEmpty()) {
            throw new IllegalArgumentException("列表为空！");
        }

        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Data");

            // 定义表头名称
            String[] headers = {
                    "条线名称",
                    "条线额度名称",
                    "标识名称",
                    "活动名称",
                    "机构代码",
                    "人员代码",
                    "预配置/配置总金额",
                    "预算类型",
                    "数据类型",
                    "明细生成时间"
            };

            // 创建字段描述行（第一行）
            Row headerRow = sheet.createRow(0);
            for (int i = 0; i < headers.length; i++) {
                headerRow.createCell(i).setCellValue(headers[i]);
            }

            // 创建日期格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            // 填充数据（从第二行开始）
            int rowNum = 1;
            for (ExpenseResponse item : data) {
                Row row = sheet.createRow(rowNum++);
                row.createCell(0).setCellValue(item.getLineName());
                row.createCell(1).setCellValue(item.getBudgetName());
                row.createCell(2).setCellValue(item.getCategoryName());
                row.createCell(3).setCellValue(item.getActivityName());
                row.createCell(4).setCellValue(item.getCompanyCode());
                row.createCell(5).setCellValue(item.getPersonnelCode());
                row.createCell(6).setCellValue(item.getBudget().toString());
                // 处理预算类型
                if (item.getBudgetType() == 1) {
                    row.createCell(7).setCellValue("预配置金额");
                } else {
                    row.createCell(7).setCellValue("配置总金额");
                }
                // 处理数据类型
                if (item.getType() == 1) {
                    row.createCell(8).setCellValue("绩效（个人）");
                } else {
                    row.createCell(8).setCellValue("费用（机构）");
                }
                // 处理日期时间
                if (item.getCreatedDate() != null) {
                    row.createCell(9).setCellValue(sdf.format(item.getCreatedDate()));
                } else {
                    row.createCell(9).setCellValue("");
                }
            }

            // 自动调整列宽
            for (int i = 0; i < headers.length; i++) {
                sheet.autoSizeColumn(i);
            }

            // 写入文件
            try (FileOutputStream fileOut = new FileOutputStream(filePath)) {
                workbook.write(fileOut);
            }
        }
    }
}
